//题目:
// 给定一个字符串 s ，通过将字符串 s 中的每个字母转变大小写，我们可以获得一个新的字符串。
// 返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
#include<iostream>
#include<vector>

using namespace std;
//代码:
class Solution 
{
    string s;
    vector<string> ret;
public:
    void dfs(int pos)
    {
        if(pos==s.size()){
            ret.push_back(s);
            return;
        }

        //1.转变当层对应的字母
        char c_buf=s[pos];
        int pos_buf=pos;
        if(s[pos]>='a' && s[pos]<='z')s[pos]+='A'-'a';
        else if(s[pos]>='A' && s[pos]<='Z')s[pos]+='a'-'A';

        pos++;
        //2.找到下一个字母的位置
        while(pos<s.size() && (s[pos]>='0' && s[pos]<='9'))pos++;
        dfs(pos);

        //3.回溯,即不转变当层对应字母
        s[pos_buf]=c_buf;
        dfs(pos);
    }
    vector<string> letterCasePermutation(string str) 
    {
        s=str;
        //找到第一个字母的位置
        int pos=0;
        while(pos<s.size() && (s[pos]>='0' && s[pos]<='9'))pos++;
        dfs(pos);

        return ret;
    }
};